home *** CD-ROM | disk | FTP | other *** search
/ Clickx 115 / Clickx 115.iso / software / tools / windows / tails-i386-0.16.iso / live / filesystem.squashfs / usr / share / arm / gui / logPanel.py < prev   
Encoding:
Python Source  |  2012-05-18  |  4.0 KB  |  127 lines

  1. """
  2. Base class for implementing graphing functionality.
  3. """
  4.  
  5. import random
  6. import sys
  7. import time
  8.  
  9. from collections import deque
  10. from threading import RLock
  11.  
  12. import gobject
  13. import gtk
  14.  
  15. from cli.logPanel import (expandEvents, setEventListening, getLogFileEntries,
  16.                           LogEntry, TorEventObserver,
  17.                           DEFAULT_CONFIG)
  18. from util import gtkTools, log, torTools, uiTools
  19. from TorCtl import TorCtl
  20.  
  21. RUNLEVEL_EVENT_COLOR = {log.DEBUG: 'insensitive', log.INFO: 'normal', log.NOTICE: 'normal',
  22.                         log.WARN: 'active', log.ERR: 'active'}
  23. STARTUP_EVENTS = 'N3'
  24. REFRESH_RATE = 3
  25.  
  26. class LogPanel:
  27.   def __init__(self, builder):
  28.     self.builder = builder
  29.  
  30.     self._config = dict(DEFAULT_CONFIG)
  31.     self._lastUpdate = 0
  32.  
  33.     self.lock = RLock()
  34.     self.msgLog = deque()
  35.     self.loggedEvents = setEventListening(expandEvents(STARTUP_EVENTS))
  36.  
  37.     torEventBacklog = deque()
  38.     if self._config["features.log.prepopulate"]:
  39.       setRunlevels = list(set.intersection(set(self.loggedEvents), set(log.Runlevel.values())))
  40.       readLimit = self._config["features.log.prepopulateReadLimit"]
  41.       addLimit = self._config["cache.logPanel.size"]
  42.       torEventBacklog = deque(getLogFileEntries(setRunlevels, readLimit, addLimit, self._config))
  43.  
  44.     armRunlevels = [log.DEBUG, log.INFO, log.NOTICE, log.WARN, log.ERR]
  45.     log.addListeners(armRunlevels, self._register_arm_event)
  46.  
  47.     setRunlevels = []
  48.     for i in range(len(armRunlevels)):
  49.       if "ARM_" + log.Runlevel.values()[i] in self.loggedEvents:
  50.         setRunlevels.append(armRunlevels[i])
  51.  
  52.     armEventBacklog = deque()
  53.     for level, msg, eventTime in log._getEntries(setRunlevels):
  54.       theme = gtkTools.Theme()
  55.       armEventEntry = LogEntry(eventTime, "ARM_" + level, msg, theme.colors[RUNLEVEL_EVENT_COLOR[level]])
  56.       armEventBacklog.appendleft(armEventEntry)
  57.  
  58.     while armEventBacklog or torEventBacklog:
  59.       if not armEventBacklog:
  60.         self.msgLog.append(torEventBacklog.popleft())
  61.       elif not torEventBacklog:
  62.         self.msgLog.append(armEventBacklog.popleft())
  63.       elif armEventBacklog[0].timestamp < torEventBacklog[0].timestamp:
  64.         self.msgLog.append(torEventBacklog.popleft())
  65.       else:
  66.         self.msgLog.append(armEventBacklog.popleft())
  67.  
  68.     conn = torTools.getConn()
  69.     conn.addEventListener(TorEventObserver(self.register_event))
  70.     conn.addTorCtlListener(self._register_torctl_event)
  71.  
  72.     gobject.idle_add(self.fill_log)
  73.  
  74.   def pack_widgets(self):
  75.     listStore = self.builder.get_object('liststore_log')
  76.  
  77.     listStore.set_sort_func(1, self._compare_rows)
  78.     listStore.set_sort_column_id(1, gtk.SORT_DESCENDING)
  79.  
  80.   def fill_log(self):
  81.     if time.time() - self._lastUpdate < REFRESH_RATE:
  82.       return
  83.  
  84.     listStore = self.builder.get_object('liststore_log')
  85.     listStore.clear()
  86.  
  87.     self.lock.acquire()
  88.     try:
  89.       for entry in self.msgLog:
  90.         timeLabel = time.strftime('%H:%M:%S', time.localtime(entry.timestamp))
  91.  
  92.         row = (long(entry.timestamp), timeLabel, entry.type, entry.msg, entry.color)
  93.         listStore.append(row)
  94.     finally:
  95.       self.lock.release()
  96.  
  97.     self._lastUpdate = time.time()
  98.  
  99.   def register_event(self, event):
  100.     if not event.type in self.loggedEvents:
  101.       return
  102.  
  103.     self.lock.acquire()
  104.     try:
  105.       self.msgLog.appendleft(event)
  106.     finally:
  107.       self.lock.release()
  108.  
  109.     gobject.idle_add(self.fill_log)
  110.  
  111.   def _register_arm_event(self, level, msg, eventTime):
  112.     theme = gtkTools.Theme()
  113.     eventColor = theme.colors[RUNLEVEL_EVENT_COLOR[level]]
  114.     self.register_event(LogEntry(eventTime, "ARM_%s" % level, msg, eventColor))
  115.  
  116.   def _register_torctl_event(self, level, msg):
  117.     theme = gtkTools.Theme()
  118.     eventColor = theme.colors[RUNLEVEL_EVENT_COLOR[level]]
  119.     self.register_event(LogEntry(time.time(), "TORCTL_%s" % level, msg, eventColor))
  120.  
  121.   def _compare_rows(self, treeModel, iter1, iter2, data=None):
  122.     timestampRaw1 = treeModel.get(iter1, 0)
  123.     timestampRaw2 = treeModel.get(iter2, 0)
  124.  
  125.     return cmp(timestampRaw1, timestampRaw2)
  126.  
  127.